package com.hxd.tabactivityfragment.common

import android.os.Build
import android.os.Bundle
import android.view.ViewTreeObserver
import android.view.WindowManager

import com.hxd.tabactivityfragment.base.BaseActivity
import com.gyf.barlibrary.ImmersionBar


import cn.bingoogolapple.swipebacklayout.BGASwipeBackHelper



/**
 *  项目名：    Tab+Activity+Fragment
 *  包名：      com.hxd.tabactivityfragment.common
 *  文件名:     UIActivity
 *  创建者:     HXD
 *  创建时间:   2019/3/7 17:15
 *  描述:       支持沉浸式和侧滑的Activity基类（默认开启沉浸式状态栏和侧滑功能）
 */

abstract class UIActivity :BaseActivity(), BGASwipeBackHelper.Delegate,
    ViewTreeObserver.OnGlobalLayoutListener{
    private var mSwipeBackHelper: BGASwipeBackHelper? = null
    private var mImmersionBar: ImmersionBar? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        initSwipeBack()
        super.onCreate(savedInstanceState)
    }

    override fun initLayout() {
        super.initLayout()
        initImmersion()
    }

    /**
     * 初始化沉浸式
     */
    private fun initImmersion() {
        //初始化沉浸式状态栏
        if (isStatusBarEnabled()) {
            statusBarConfig()?.init()

            //设置标题栏
            if (getTitleBarId() > 0) {
                ImmersionBar.setTitleBar(this, findViewById(getTitleBarId()))
            }
        }
    }

    open fun getSwipeBackHelper(): BGASwipeBackHelper = mSwipeBackHelper!!

    /**
     * 初始化滑动返回。在 super.onCreate(savedInstanceState) 之前调用该方法
     */
    private fun initSwipeBack() {
        mSwipeBackHelper = BGASwipeBackHelper(this, this)
        // 「必须在 Application 的 onCreate 方法中执行 BGASwipeBackHelper.init 来初始化滑动返回」
        // 下面几项可以不配置，这里只是为了讲述接口用法。

//        // 设置滑动返回是否可用。默认值为 true
//        mSwipeBackHelper.setSwipeBackEnable(true)
//        // 设置是否仅仅跟踪左侧边缘的滑动返回。默认值为 true
//        mSwipeBackHelper.setIsOnlyTrackingLeftEdge(true)
//        // 设置是否是微信滑动返回样式。默认值为 true
//        mSwipeBackHelper.setIsWeChatStyle(true)
//        // 设置阴影资源 id。默认值为 R.drawable.bga_sbl_shadow
//        mSwipeBackHelper.setShadowResId(R.drawable.bga_sbl_shadow)
//        // 设置是否显示滑动返回的阴影效果。默认值为 true
//        mSwipeBackHelper.setIsNeedShowShadow(true)
//        // 设置阴影区域的透明度是否根据滑动的距离渐变。默认值为 true
//        mSwipeBackHelper.setIsShadowAlphaGradient(true)
//        // 设置触发释放后自动滑动返回的阈值，默认值为 0.3f
//        mSwipeBackHelper.setSwipeBackThreshold(0.3f)
//        // 设置底部导航条是否悬浮在内容上，默认值为 false
//        mSwipeBackHelper.setIsNavigationBarOverlap(false)
    }

    /**
     * 是否支持滑动返回。这里在父类中默认返回 true 来支持滑动返回
     * 如果某个界面不想支持滑动返回则重写该方法返回 false 即可
     */
    override fun isSupportSwipeBack(): Boolean{
        return true
    }

    /**
     * 正在滑动返回
     *
     * @param slideOffset 从 0 到 1
     */
    override fun onSwipeBackLayoutSlide(slideOffset: Float) {}

    /**
     * 没达到滑动返回的阈值，取消滑动返回动作，回到默认状态
     */
    override fun onSwipeBackLayoutCancel() {}

    /**
     * 滑动返回执行完毕，销毁当前 Activity
     */
    override fun onSwipeBackLayoutExecuted() {
        mSwipeBackHelper?.swipeBackward()
    }

    override fun onBackPressed() {
        // 正在滑动返回的时候取消返回按钮事件
        if (mSwipeBackHelper!!.isSliding) {
            return
        }
        mSwipeBackHelper!!.backward()
        super.onBackPressed()
    }

    /**
     * 是否使用沉浸式状态栏
     */
    open fun isStatusBarEnabled(): Boolean{
        return true
    }

    /**
     * 获取状态栏沉浸的配置对象
     */
    open fun getStatusBarConfig(): ImmersionBar? = mImmersionBar

    /**
     * 初始化沉浸式状态栏
     */
    private fun statusBarConfig(): ImmersionBar {
        //在BaseActivity里初始化
        mImmersionBar = ImmersionBar.with(this)
            .statusBarDarkFont(statusBarDarkFont())    //默认状态栏字体颜色为黑色
            .keyboardEnable(
                false,
                WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN or
                        WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN
            )
        //解决软键盘与底部输入框冲突问题，默认为false，还有一个重载方法，可以指定软键盘mode
        //必须设置View树布局变化监听，否则软键盘无法顶上去，还有模式必须是SOFT_INPUT_ADJUST_PAN
        window.decorView.viewTreeObserver.addOnGlobalLayoutListener(this)
        return mImmersionBar!!
    }

    /**
     * [ViewTreeObserver.OnGlobalLayoutListener]
     */
    override fun onGlobalLayout() {}//不用写任何方法

    /**
     * 获取状态栏字体颜色
     * 返回false表示白色字体
     */
    open fun statusBarDarkFont(): Boolean = true

    override fun onDestroy() {
        super.onDestroy()
        if (mImmersionBar != null) mImmersionBar!!.destroy()
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            window.decorView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        }
    }
}